home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9404_2.lha / tips & tricks / remtd.asm < prev    next >
Assembly Source File  |  1994-02-28  |  3KB  |  104 lines

  1. ; *** Includes laden (Pfad individuell setzen!) ***
  2.  
  3.     INCDIR  maxon:include/
  4.     INCLUDE exec/exec_lib.i
  5.     INCLUDE exec/execbase.i
  6.     INCLUDE exec/tasks.i
  7.  
  8.     ;--- Nur bei Start von WBench nötig: ----
  9.     INCLUDE startup.asm
  10.  
  11. *************************************
  12. *                RemTD              *
  13. *-----------------------------------*
  14. * Funktion: Schaltet Laufwerke ab   *
  15. * (friert sie ein). Bei nochmaligem *
  16. * Aufruf werden diese wieder        *
  17. * aktiviert.                        *
  18. * Eingabe : -------------           *
  19. * Ausgabe : -------------           *
  20. * Aufruf  :                         *
  21. *  CLI/Shell: RemTD ohne Argumente  *
  22. *  Workbench: Piktogramm            *
  23. *************************************
  24.  
  25. Main
  26.     lea     TaskName(pc),a5
  27.     lea     TDBasis(pc),a4
  28.     move.l  $4.w,a6
  29.     jsr     _LVODisable(a6)   ;System einfrieren
  30.  
  31. .loop
  32.     move.l  a5,a1
  33.     jsr     _LVOFindTask(a6)  ;TD suchen
  34.     tst.l   d0                ;gefunden?
  35.     beq.s   .notd             ;Nein -> ab!
  36.  
  37.     move.l  d0,a1           ;Ja -> Basis nach a1
  38.     cmp.b   #8,TC_STATE(a1) ;Task schon gefroren?
  39.     beq.s   .makeactive     ;Ja -> aktivieren
  40.                             ;Nein -> einfrieren
  41.     moveq   #0,d7           ;Flag, TD in TaskWait-Liste
  42.     move.b  #8,TC_STATE(A1) ;TS_FROZEN nach Statusflag
  43.  
  44. .remtd
  45.     move.l  a1,(a4)+       ;in eigene Liste eintragen
  46.     jsr     _LVORemove(a6) ;Basis aus System entfernen
  47.  
  48.     bra.s   .loop     ;Weiter, bis Ende...
  49.  
  50.     ;--- Task aktivieren ---
  51.  
  52. .makeactive
  53.     moveq   #1,d7     ;Flag, TD in TaskReady-Liste
  54.     move.b  #TS_READY,TC_STATE(a1) ;Ready als Status
  55.     bra.s   .remtd    ;und Liste entfernen
  56.  
  57. .notd
  58.     lea     TDBasis(pc),a4    ;Eigene Liste nach a4
  59.     lea     TaskWait(a6),a3   ;TaskWait-Liste aus Exec
  60.     tst     d7                ;Flag testen
  61.     beq.s   .loopinit         ;False -> Liste übernehmen
  62.     lea     TaskReady(a6),a3  ;sonst TaskReady-Liste
  63.  
  64. .loopinit
  65.     tst.l   (a4)      ;Einträge vorhanden?
  66.     beq.s   .norm     ;nein-> normal weiter
  67.  
  68. .loopins    move.l  (a4)+,a1 ;node holen
  69.     move.l  a3,a0            ;Liste nach a0
  70.     jsr     _LVOEnqueue(a6)  ;Node in Liste einfügen
  71.     tst.l   (a4)             ;weitere Node vorhanden?
  72.     beq.s   .norm            ;Nein -> normal weiter
  73.     bra.s   .loopins         ;sonst Schleifenanfang
  74.  
  75. .norm
  76.     jsr     _LVOEnable(a6)    ;System wecken
  77.     suba.l  a1,a1             ;Eigenen Task suchen
  78.     jsr     _LVOFindTask(a6)
  79.     move.l  d0,a1             ;-> nach a1
  80.     tst.l   d0                ;nicht gefunden
  81.     beq.s   .weg              ;dann Ende
  82.  
  83.     moveq   #0,d0     ;Rescheduling durchführen
  84.     move.b  LN_PRI(a1),d0      ;damit modifizierte Liste
  85.     jsr     _LVOSetTaskPri(a6) ;anerkannt wird...
  86.  
  87. .weg
  88.     moveq   #0,d0     ;Return-Flag setzen
  89.     rts               ;und weg...
  90.  
  91. ;*** Namen und Strukturen ***
  92.  
  93. TaskName
  94.     dc.b    "trackdisk.device",0
  95.     even
  96.  
  97.     ;--- genügend Platz für TD-Basen lassen ---
  98. TDBasis
  99.     dc.l    0,0,0,0,0,0 ;man weiß nie!
  100.  
  101. VersionsString:
  102.     dc.b    "$VER: RemTD V0.5 (24.12.93)"
  103.     even
  104.